Extraindo e Visualizando Dados com Web Scraping e Plotly


Introdução

Este projeto tem como objetivo demonstrar a extração e visualização de dados financeiros de empresas públicas, utilizando técnicas de Web Scraping e a biblioteca Plotly. As empresas escolhidas para análise foram Tesla e GameStop, e os dados foram coletados do Yahoo! Finance e Macrotrends.


Descrição do Projeto¶

Este projeto demonstra a extração e visualização de dados financeiros das empresas Tesla e GameStop, utilizando técnicas de Web Scraping e a biblioteca Plotly. O objetivo principal é analisar o histórico de preços das ações e a receita dessas empresas ao longo do tempo, buscando identificar tendências e insights relevantes.

Processo de Web Scraping:

Para coletar os dados, foram utilizadas as seguintes ferramentas e bibliotecas:

  • yfinance: Para extrair o histórico de preços das ações da Tesla e GameStop diretamente do Yahoo! Finance.
  • requests: Para fazer requisições HTTP e obter o conteúdo HTML das páginas web.
  • Beautiful Soup: Para realizar o parsing do HTML e extrair as informações desejadas, como a receita das empresas.
  • pandas: Para manipular e organizar os dados em formato de DataFrames.

Visualização de Dados:

Após a extração e limpeza dos dados, foram gerados gráficos interativos utilizando a biblioteca Plotly. Esses gráficos permitem visualizar:

  • Preço Histórico das Ações: Mostra a variação do preço das ações da Tesla e GameStop ao longo do tempo.
  • Valor Histórico de Receita: Apresenta a evolução da receita das empresas ao longo dos anos.

A combinação do Web Scraping com a visualização de dados proporciona uma análise abrangente do desempenho financeiro das empresas, facilitando a identificação de padrões e insights importantes.

Observação: Este projeto foi desenvolvido como parte do curso "Python Project for Data Science" da IBM.


Índice

  • Definindo uma função que cria o gráfico
  • Passo 1: Usando yfinance para extrair dados de ações da Tesla
  • Passo 2: Usando Web scraping para extrair dados de receita da Tesla
  • Passo 3: Usando yfinance para extrair dados de ações da GameStop
  • Passo 4: Usando Web scraping para extrair dados de receita da GameStop
  • Passo 5: Plotando o gráfico da Tesla
  • Passo 6: Plotando o gráfico da GameStop

In [5]:
#Caso queira rodar esse notebook localmente
#!pip install yfinance
#!pip install bs4
#!pip install nbformat
In [6]:
# Importa a biblioteca yfinance para acessar dados financeiros de ações
import yfinance as yf
# Importa a biblioteca pandas para manipulação de dados em formato de DataFrame
import pandas as pd
# Importa a biblioteca requests para fazer requisições HTTP
import requests
# Importa a biblioteca BeautifulSoup da bs4 para fazer web scraping de HTML
from bs4 import BeautifulSoup
# Importa o Plotly para visualização de gráficos interativos
import plotly.graph_objects as go
# Importa a função make_subplots do Plotly para criar gráficos com múltiplos subgráficos
from plotly.subplots import make_subplots

Em Python, é possível ignorar avisos utilizando o módulo warnings. Usei a função filterwarnings para filtrar ou ignorar mensagens de aviso específicas que não são relevantes para os resultados da análise.

In [8]:
# Importa o módulo de warnings para filtrar ou ignorar mensagens de aviso
import warnings
# Ignora todos os avisos do tipo FutureWarning
warnings.filterwarnings("ignore", category=FutureWarning)

Definindo uma função que cria o gráfico

In [10]:
# Função para criar um gráfico comparando preço das ações e receita das empresas
def make_graph(stock_data, revenue_data, stock):
    # Cria um gráfico com 2 subgráficos, um para o preço das ações e outro para a receita
    fig = make_subplots(rows=2, cols=1, shared_xaxes=True, subplot_titles=("Preço Histórico das Ações", "Valor Histórico de Receita"), vertical_spacing = .3)

    # Obtém a data mais recente dos dados
    latest_date_stock = stock_data["Date"].max()
    latest_date_revenue = revenue_data["Date"].max()

    # Filtra os dados até a data mais recente
    stock_data_specific = stock_data[stock_data.Date <= latest_date_stock]
    revenue_data_specific = revenue_data[revenue_data.Date <= latest_date_revenue]

    # Adiciona o gráfico do preço das ações no primeiro subgráfico
    fig.add_trace(go.Scatter(x=pd.to_datetime(stock_data_specific.Date),
                             y=stock_data_specific.Close.astype("float"), name="Share Price"), row=1, col=1)
    # Adiciona o gráfico da receita no segundo subgráfico
    fig.add_trace(go.Scatter(x=pd.to_datetime(revenue_data_specific.Date),
                             y=revenue_data_specific.Revenue.astype("float"), name="Revenue"), row=2, col=1)

    # Configura o título dos eixos X para ambos os gráficos
    fig.update_xaxes(title_text="Data", row=1, col=1)
    fig.update_xaxes(title_text="Data", row=2, col=1)

    # Configura o título dos eixos Y para ambos os gráficos
    fig.update_yaxes(title_text="Preço ($US)", row=1, col=1)
    fig.update_yaxes(title_text="Receita ($US Milhões)", row=2, col=1)

    # Configura o layout do gráfico
    fig.update_layout(showlegend=False,
                      height=900,
                      title=stock,
                      xaxis_rangeslider_visible=True)
    # Exibe o gráfico
    fig.show()

Passo 1: Usando yfinance para extrair dados de ações da Tesla

  • Utilizei o pacote yfinance para obter dados históricos das ações da Tesla.
  • A função yf.Ticker("TSLA") cria um objeto associado ao ticker "TSLA" (Tesla) que permite acessar diversas informações financeiras.
  • Em seguida, os dados históricos das ações são extraídos com o método history(period="max"), que busca todos os dados disponíveis desde o início da negociação das ações.
  • Após isso, o índice do DataFrame é resetado com reset_index(inplace=True) para garantir que a coluna "Date" seja tratada como uma coluna regular, e não como o índice.
  • Por fim, tesla_data.head() exibe as cinco primeiras linhas do DataFrame para que o usuário possa verificar a estrutura e os dados obtidos.
In [13]:
# Usa a função Ticker para criar um objeto para o ticker da Tesla
tesla = yf.Ticker("TSLA")
# Extrai os dados históricos de ações da Tesla com o máximo de dados disponíveis
tesla_data = tesla.history(period="max")
# Reseta o índice do DataFrame para que a coluna 'Date' fique como uma coluna normal
tesla_data.reset_index(inplace=True)
# Exibe as primeiras 5 linhas do DataFrame para verificar os dados
tesla_data.head()
Out[13]:
Date Open High Low Close Volume Dividends Stock Splits
0 2010-06-29 00:00:00-04:00 1.266667 1.666667 1.169333 1.592667 281494500 0.0 0.0
1 2010-06-30 00:00:00-04:00 1.719333 2.028000 1.553333 1.588667 257806500 0.0 0.0
2 2010-07-01 00:00:00-04:00 1.666667 1.728000 1.351333 1.464000 123282000 0.0 0.0
3 2010-07-02 00:00:00-04:00 1.533333 1.540000 1.247333 1.280000 77097000 0.0 0.0
4 2010-07-06 00:00:00-04:00 1.333333 1.333333 1.055333 1.074000 103003500 0.0 0.0

Passo 2: Usando Web scraping para extrair dados de receita da Tesla

  • Utilizei o requests para fazer o download da página Macrotrends que contém dados financeiros da Tesla.
  • O conteúdo da página é recuperado e armazenado na variável html_data.
  • Em seguida, o BeautifulSoup é empregado para parsear o conteúdo HTML da página e facilitar a extração das informações desejadas.
  • A partir da análise da estrutura da página, a função pd.read_html() é usada para capturar a tabela de receita da Tesla, que é então armazenada em um DataFrame chamado tesla_revenue.
  • As colunas do DataFrame são renomeadas para "Date" e "Revenue".
  • A formatação de valores monetários (removendo símbolos de dólar e vírgulas) é realizada.
  • O código ainda limpa as linhas com dados faltantes ou vazios, garantindo que o DataFrame esteja pronto para análise.
In [16]:
# Usa a biblioteca requests para fazer uma requisição HTTP e obter os dados da página
html_data = requests.get("https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-PY0220EN-SkillsNetwork/labs/project/revenue.htm").text
# Usa o BeautifulSoup para fazer o parsing do HTML
soup = BeautifulSoup(html_data, "html.parser")
# Extrai as tabelas da página usando pandas
tesla_tables = pd.read_html(html_data)
# Seleciona a tabela relevante e renomeia as colunas para 'Date' e 'Revenue'
tesla_revenue = tesla_tables[1]
tesla_revenue.columns = ['Date', 'Revenue']
# Exibe as primeiras 5 linhas para conferir os dados extraídos
tesla_revenue.head()
Out[16]:
Date Revenue
0 2022-09-30 $21,454
1 2022-06-30 $16,934
2 2022-03-31 $18,756
3 2021-12-31 $17,719
4 2021-09-30 $13,757

Preparando os dados

  • Removi os caracteres de vírgula e o símbolo de dólar da coluna 'Revenue' no DataFrame tesla_revenue usando a função replace() com regex para manter apenas números.
  • Removi qualquer valor nulo na coluna 'Revenue' com o método dropna(), garantindo que não haja dados ausentes.
  • Filtrei o DataFrame para remover linhas onde a coluna 'Revenue' esteja vazia, garantindo que não haja entradas em branco.
  • Exibi as últimas 5 linhas do DataFrame usando tail() para verificar os dados limpos e garantir que as transformações foram aplicadas corretamente.
In [18]:
# Remove os caracteres de vírgula e o símbolo de dólar da coluna de 'Revenue'
tesla_revenue["Revenue"] = tesla_revenue["Revenue"].replace(r"[^0-9]", "", regex=True)
# Remove qualquer valor nulo ou vazio na coluna de 'Revenue'
tesla_revenue.dropna(inplace=True)
tesla_revenue = tesla_revenue[tesla_revenue['Revenue'] != ""]
# Exibe as últimas 5 linhas do DataFrame para verificar os dados limpos
tesla_revenue.tail()
Out[18]:
Date Revenue
48 2010-09-30 31
49 2010-06-30 28
50 2010-03-31 21
52 2009-09-30 46
53 2009-06-30 27

Passo 3: Usando yfinance para extrair dados de ações da GameStop

Para a GameStop, repeti os mesmos processos anteriores das ações da Tesla.

In [21]:
# Cria um objeto para o ticker da GameStop
gme = yf.Ticker("GME")
# Extrai os dados históricos de ações da GameStop
gme_data = gme.history(period="max")
# Reseta o índice do DataFrame da GameStop
gme_data.reset_index(inplace=True)
# Exibe as primeiras 5 linhas para verificar os dados
gme_data.head()
Out[21]:
Date Open High Low Close Volume Dividends Stock Splits
0 2002-02-13 00:00:00-05:00 1.620128 1.693350 1.603296 1.691666 76216000 0.0 0.0
1 2002-02-14 00:00:00-05:00 1.712707 1.716074 1.670626 1.683250 11021600 0.0 0.0
2 2002-02-15 00:00:00-05:00 1.683251 1.687459 1.658002 1.674834 8389600 0.0 0.0
3 2002-02-19 00:00:00-05:00 1.666418 1.666418 1.578047 1.607504 7410400 0.0 0.0
4 2002-02-20 00:00:00-05:00 1.615920 1.662209 1.603296 1.662209 6892800 0.0 0.0

Passo 4: Usando Web scraping para extrair dados de receita da GameStop

Para a GameStop, repeti os mesmos processos anteriores das ações da Tesla.

In [24]:
# Faz uma requisição HTTP para obter os dados da página da GameStop
html_data_2 = requests.get("https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-PY0220EN-SkillsNetwork/labs/project/stock.html").text
# Faz o parsing do HTML da página usando BeautifulSoup
soup = BeautifulSoup(html_data_2, "html.parser")
# Extrai a tabela de receita da GameStop e armazena em um DataFrame
gme_tables = pd.read_html(html_data_2)
gme_revenue = gme_tables[1]
gme_revenue.columns = ['Date', 'Revenue']
# Exibe as últimas 5 linhas para verificar os dados extraídos
gme_revenue.head()
Out[24]:
Date Revenue
0 2020-04-30 $1,021
1 2020-01-31 $2,194
2 2019-10-31 $1,439
3 2019-07-31 $1,286
4 2019-04-30 $1,548

Preparando os dados

Para a GameStop, repeti os mesmos processos anteriores das ações da Tesla.

In [26]:
# Remove os caracteres de vírgula e o símbolo de dólar da coluna de 'Revenue'
gme_revenue["Revenue"] = gme_revenue["Revenue"].replace(r"[^0-9]", "", regex=True)
# Remove qualquer valor nulo ou vazio na coluna de 'Revenue'
gme_revenue.dropna(inplace=True)
gme_revenue = gme_revenue[gme_revenue['Revenue'] != ""]
# Exibe as últimas 5 linhas do DataFrame para verificar os dados limpos
gme_revenue.tail()
Out[26]:
Date Revenue
57 2006-01-31 1667
58 2005-10-31 534
59 2005-07-31 416
60 2005-04-30 475
61 2005-01-31 709

Passo 5: Plotando o gráfico da Tesla

Por fim, vamos plotar o gráfico de resultados da Tesla.

In [29]:
# Chama a função make_graph para gerar o gráfico da Tesla com os dados de ações e receita
make_graph(tesla_data, tesla_revenue, 'Tesla')

Passo 6: Plotando o gráfico da GameStop

Por fim, vamos plotar o gráfico de resultados da GameStop.

In [32]:
# Chama a função make_graph para gerar o gráfico da GameStop com os dados de ações e receita
make_graph(gme_data, gme_revenue, 'GameStop')

Conclusões¶

Através da análise dos dados de ações e receita da Tesla e GameStop, foi possível observar algumas tendências interessantes:

Tesla:

  • Crescimento consistente: As ações da Tesla apresentaram um crescimento significativo ao longo dos anos, impulsionado pela demanda por veículos elétricos e pela inovação da empresa.
  • Aumento da receita: A receita da Tesla também demonstrou um aumento considerável, acompanhando o crescimento das vendas de veículos e de outros produtos e serviços da empresa.
  • Volatilidade: Apesar do crescimento, as ações da Tesla também demonstram volatilidade, com períodos de alta e baixa. Isso pode ser atribuído a diversos fatores, como notícias do mercado, expectativas dos investidores e a própria natureza inovadora da empresa.

GameStop:

  • Flutuações acentuadas: As ações da GameStop apresentaram flutuações significativas nos últimos anos, impulsionadas por eventos como o "short squeeze" de 2021, onde pequenos investidores se uniram para inflar o preço das ações.
  • Receita em transformação: A receita da GameStop tem passado por um período de transformação, com a empresa buscando se adaptar ao mercado de jogos digitais e diversificar seus negócios.
  • Maior risco: As ações da GameStop são consideradas de maior risco, devido à volatilidade e às incertezas sobre o futuro da empresa no mercado de games.

Considerações Gerais:

  • O web scraping se mostrou uma ferramenta eficiente para coletar dados financeiros de empresas públicas, permitindo a análise de informações relevantes para a tomada de decisões de investimento.
  • A visualização de dados com a biblioteca Plotly possibilitou a identificação de tendências e padrões nos dados, facilitando a compreensão do desempenho das empresas ao longo do tempo.
  • É importante ressaltar que este projeto tem fins educacionais e as conclusões aqui apresentadas não devem ser interpretadas como recomendações de investimento.

Observação: Os insights acima são baseados em informações gerais sobre as empresas e podem não refletir a realidade atual do mercado. Para uma análise mais aprofundada, é recomendado consultar fontes de dados e informações financeiras atualizadas.